package com.itheima.tlias84.controller;

import com.itheima.tlias84.dto.SelectAllDeptDTO;
import com.itheima.tlias84.entity.Dept;
import com.itheima.tlias84.mapper.DeptMapper;
import com.itheima.tlias84.po.InsertDeptParam;
import com.itheima.tlias84.servrce.DeptService;
import com.itheima.tlias84.utils.ResultUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
/**
 * @RequestMapping Target -> 类上,方法上
 *                   类上 -> 提取一个controller中的重复路径
 *                   方法上 -> 定义该接口的请求方法的 被对应的GetMapping... PostMapping等方法替代了
 *
 */
@RequestMapping("/depts")
public class DeptController {
    /**
     * @Autowired 默认Bean类型注入
     * @Resource 属性注入优先使用
     *           默认的Bean名字从容器中获取
     *           默认的SpringBean名字是小驼峰
     *           当不同包下存在同名类的时候 -> 解决办法:
     *                                     @Component注解在创建Bean的时候指定名字 @Component(value = "deptService")
     *                                     @Resource 从ico容器获取时也指定名字 @Resource(name = "deptService")
     *
     */
    //注入DeptService 对象
//    @Autowired
//    DeptService deptService;
    @Resource
    DeptService deptService;

    @GetMapping
    public ResultUtil selectAll() {
        List<SelectAllDeptDTO> depts = deptService.selectAll();
        return ResultUtil.success(depts);
    }

    /**
     * get/delete 请求参数一般拼接到url后面
     * post/put 请求参数一般放在请求体里面,且以JSON格式进行传输
     *
     * @RequestBody 作用一就是从http请求体中读取传输的数据
     * 作用二 把JSON字符串自动变成对象
     */
    @PostMapping
    public ResultUtil insertDept(@RequestBody InsertDeptParam param) {
        //把JSON字符串变成对象
        log.info("请求体:{}", param.getName());
        int flag = deptService.insertDept(param);
        return flag == 0 ? ResultUtil.fail("添加失败") : ResultUtil.success("添加成功");
//        try {
//            BufferedReader reader = request.getReader();
//            log.info("读取请求体中的数据{}", reader.readLine());
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//
    }

    /**
     * @RequestParam 作用:
     *                  1.根据指定的K,获取Http URL的值   value/name属性
     *                  2.可以指定是否必传参数,如果指定必传参数,前段没传相应参数 ->400   required
     *                  3.给参数指定默认值  defaultValue  默认值属性
     * @param id
     * @return
     */
    @DeleteMapping
    public ResultUtil deleteById(Integer id) {
        log.info("删除id:{}",id);
        int i = deptService.deleteById(id);
        return i == 0 ? ResultUtil.fail("删除失败") : ResultUtil.success("删除成功");
    }

    /**
     * @PathVariable 作用:获取URI 中以/为分割的参数与@RequestParam注解类似
     * @param id
     * @return
     */
//    @GetMapping("{id}")
//    public ResultUtil selectById(@RequestParam("id") Integer id) {
//        SelectAllDeptDTO dto = deptService.selectById(id);
//        return ResultUtil.success(dto);
//    }

    @GetMapping("/{id}")
    public ResultUtil selectById(@PathVariable("id") Integer id) {
        SelectAllDeptDTO dto = deptService.selectById(id);
        return ResultUtil.success(dto);
    }

    @PutMapping
     public ResultUtil updateById(@RequestBody Dept dept){
        int i = deptService.updateById(dept);
        log.info("修改的部门信息:{}",i);
        return i == 0 ? ResultUtil.fail() : ResultUtil.success();
    }

    @DeleteMapping("batchDelete")
    public ResultUtil batchDelete(@RequestParam("ids") List<Integer> ids) {
        log.info("批量删除的部门信息:{}",ids);
        int i = deptService.batchDelete(ids);
        return i==0 ? ResultUtil.fail() : ResultUtil.success();
    }
}
